/*
顺序表
概念
顺序存储：将结点依次存放在计算机内存中一组连续的存储单元中，逻辑结构中相邻的结点它的存储位置也相邻。
顺序表：用顺序存储实现的线性表，一般使用数组来表示顺序表。
 */
#include <stdio.h>

#define Maxsize 10

typedef struct
{
	int num;      // 学号
	char name[8]; // 姓名
	int age;      // 年龄
} DataType;       // 定义节点类型

typedef struct
{
	DataType data[Maxsize]; // 存放数据的数组
	int length;             // 顺序表实际长度
} SeqList;                  // 顺序表的类型

//插入元素
void InsertSeqList(SeqList* L, DataType data, int no)
{
	// 判断满了不可以插入
	if (L->length >= Maxsize)
	{
		printf("表满了,不可以再插入!\n");
		return;
	}
	if (no < 1 || no > L->length + 1)
	{
		printf("插入位置不合法!\n");
	}
	for (int i = L->length; i >= no; i--)
	{
		L->data[i] = L->data[i - 1];
	}
	L->data[no - 1] = data;
	L->length++;

}

//删除元素
void deleteSeqList(SeqList* L, int no)
{
	// 判断删除位置是否合法
	if (no < 1 || no > L->length)
	{
		printf("删除位置不合法!\n");
		return;
	}
	for (int i = no; i < L->length; i++)
	{
		L->data[i - 1] = L->data[i];
	}
	L->length--;

}

//定位元素位置
int locateSeqList(SeqList* L, DataType data) {
	for (int i = 0; i < L->length; i++) {
		if (L->data[i].num == data.num) {
			return i + 1;
		}
	}

	return 0;
}
//打印元素
void PrintSeqList(SeqList* L)
{
	if (L->length == 0)
	{
		printf("顺序表为空!\n");
		return;
	}
	for (int i = 0; i < L->length; i++)
	{
		printf("学号: %d, 姓名: %s, 年龄: %d\n", L->data[i].num, L->data[i].name, L->data[i].age);
	}

}
int main()
{
	// 定义一个顺序表
	SeqList list;
	list.length = 0;
	DataType student1 = { 1001, "李四1", 21 };
	DataType student2 = { 1002, "王五2", 22 };
	DataType student3 = { 1003, "王五3", 23 };
	DataType student4 = { 1004, "王五4", 24 };
	DataType student5 = { 1005, "王五5", 25 };
	DataType student6 = { 1006, "王五6", 26 };
	DataType student7 = { 1007, "王五7", 27 };
	DataType student8 = { 1008, "王五8", 28 };
	DataType student9 = { 1009, "王五9", 29 };
	DataType student10 = { 10010, "王五10", 20 };

	// 插入元素
	InsertSeqList(&list, student1, 1);
	InsertSeqList(&list, student2, 2);
	InsertSeqList(&list, student3, 3);

	// 打印顺序表中的所有数据
	PrintSeqList(&list);

	//定位元素位置
	int res = locateSeqList(&list, student1);
	printf("res=%d\n", res);

	return 0;
}
